package com.coolwalker.common.utils;

import com.coolwalker.common.domain.DataTreeEntity;

import java.util.ArrayList;
import java.util.List;

public class DataTreeParse {

    /**
     * 解析树形数据
     *
     * @param topId 顶级父ID
     * @param entityList 实体列表
     * @return 返回构建树的结果
     */
    public static <E extends DataTreeEntity<E>> List<E> getTreeList(Long topId, List<E> entityList) {
        if(entityList == null || entityList.size() <= 0) {
            return new ArrayList<>();
        }
        List<E> result = new ArrayList<>();
        // 获取顶层元素集合
        Long parentId;
        for (E entity : entityList) {
            parentId = entity.getParentId();
            if (parentId == null || topId.equals(parentId)) {
                result.add(entity);
            }
        }
        // 获取每个顶层元素的子数据集合
        for (E entity : result) {
            entity.setChildren(getSubList(entity.getId(), entityList));
        }

        return result;
    }

    /**
     * 递归子元素
     *
     * @param id 顶级元素的ID
     * @param entityList 实体列表
     * @return 返回构建树的结果
     */
    public static <E extends DataTreeEntity<E>> List<E> getSubList(Long id, List<E> entityList) {
        List<E> childList = new ArrayList<>();
        Long parentId;
        // 子集的直接子对象
        for (E entity : entityList) {
            parentId = entity.getParentId();
            if (id.equals(parentId)) {
                childList.add(entity);
            }
        }
        // 子集的间接子对象
        for (E entity : childList) {
            entity.setChildren(getSubList(entity.getId(), entityList));
        }
        // 递归退出条件
        if (childList.size() == 0) {
            return null;
        }
        return childList;
    }

}
